
# 从 qtpy 库导入 QtGui 模块，用于处理图形相关操作
from qtpy import QtGui
# 从 qtpy 库导入 QtCore 模块，提供核心的非 GUI 功能
from qtpy import QtCore
# 从 qtpy.QtWidgets 模块导入 QGraphicsWidget 类，用于创建图形界面中的可交互部件
from qtpy.QtWidgets import QGraphicsWidget


class backDrop(QGraphicsWidget):
    """
    backDrop 类继承自 QGraphicsWidget，用于创建一个背景图形部件。
    该部件与父节点关联，当父节点被销毁时，该部件也会从场景中移除。
    同时，该部件会根据父节点的位置信息绘制边界矩形，并在特定条件下进行绘制操作。
    """
    def __init__(self, parent):
        """
        初始化 backDrop 实例。

        :param parent: 父节点对象，该背景部件与父节点关联。
        """
        # 调用父类 QGraphicsWidget 的构造函数
        super(backDrop, self).__init__()
        # 保存父节点对象
        self.parent = parent
        # 初始化一个矩形对象，用于存储背景部件的边界矩形
        self.rect = QtCore.QRectF()
        try:
            # 尝试将父节点的 _rawNode 的 killed 信号连接到 self.parentNodeKilled 方法
            # 当父节点的 _rawNode 被销毁时，会触发 self.parentNodeKilled 方法
            self.parent._rawNode.killed.connect(self.parentNodeKilled)
        except:
            # 若连接失败，忽略该异常
            pass

    def parentNodeKilled(self, *args):
        """
        当父节点的 _rawNode 被销毁时调用此方法。
        该方法会将当前背景部件从场景中移除，并删除该对象。

        :param args: 可变参数，接收信号传递的额外参数。
        """
        # 获取当前背景部件所在的场景
        scene = self.scene()
        if scene is not None:
            # 若场景存在，将当前背景部件从场景中移除
            scene.removeItem(self)
            # 删除当前背景部件对象
            del self

    def boundingRect(self):
        """
        返回当前背景部件的边界矩形。
        该矩形根据父节点的位置信息计算得出，若计算失败则返回一个空矩形。

        :return: 表示背景部件边界的矩形对象。
        """
        try:
            return QtCore.QRectF(
                # 计算矩形的左上角点，横坐标为父节点左侧位置减 5，纵坐标为父节点顶部位置加 5
                QtCore.QPointF(self.parent.left - 5, self.parent.top + 5),
                # 计算矩形的右下角点，横坐标为父节点右侧位置加 5，纵坐标为父节点底部位置减 5
                QtCore.QPointF(self.parent.right + 5, self.parent.down - 5),
            )
        except:
            # 若计算过程中出现异常，返回一个空矩形
            return QtCore.QRectF(0, 0, 0, 0)

    def paint(self, painter, option, widget):
        """
        绘制当前背景部件。
        只有当父节点处于活动图中时才会进行绘制操作，绘制内容包括填充路径和绘制路径。

        :param painter: 用于绘制图形的 QPainter 对象。
        :param option: 包含绘制选项的 QStyleOptionGraphicsItem 对象。
        :param widget: 可选的绘制部件，可能为 None。
        """
        # 检查父节点是否不在活动图中，若是则直接返回，不进行绘制
        if not self.parent.isUnderActiveGraph():
            return

        # 创建一个 QPainterPath 对象，用于存储绘制路径
        roundRectPath = QtGui.QPainterPath()
        # 调用父节点的 computeHull 方法，计算凸包
        self.parent.computeHull()
        # 检查父节点的 poly 属性是否不为 None
        if self.parent.poly is not None:
            # 根据父节点的 headColorOverride 属性创建一个 QColor 对象，并设置透明度为 50
            color = QtGui.QColor(self.parent.headColorOverride)
            color.setAlpha(50)
            # 根据父节点的 headColorOverride 属性创建一个 QPen 对象，线宽为 0.5
            pen = QtGui.QPen(self.parent.headColorOverride, 0.5)
            # 设置绘制的画笔
            painter.setPen(pen)
            # 使用指定的颜色填充父节点的 poly 路径
            painter.fillPath(self.parent.poly, color)
            # 绘制父节点的 poly 路径
            painter.drawPath(self.parent.poly)